如何设计一个 RAG 系统

RAG(Retrieval-Augmented Generation) 是当前企业级大模型应用中最常见的架构之一。其核心思想是:通过外部知识库检索相关信息,再将检索结果作为上下文提供给大模型生成答案,从而解决模型幻觉(Hallucination)、知识时效性和私有知识接入等问题。

一个完整的 RAG 系统通常包含以下核心阶段:

  1. 文档解析(Document Parsing)
  2. 文档切片(Chunking)
  3. 向量化(Embedding)
  4. 向量存储(Vector Storage)
  5. 检索(Retrieval)
  6. 重排(Rerank)
  7. Prompt 构建与生成(Generation)

一、RAG 的核心思想

RAG(Retrieval-Augmented Generation)是一种将 信息检索系统 与 **大语言模型(LLM)**结合的架构。

核心思想:

先检索,再生成。

工作流程:

  1. 从知识库中检索相关信息
  2. 将检索结果作为上下文输入大模型
  3. 由模型生成最终答案

RAG 解决的核心问题:


二、RAG 系统整体架构

一个典型 RAG 系统包含 离线数据处理 + 在线检索服务 两部分。

flowchart TD

A[企业文档] --> B[文档解析]
B --> C[文本清洗]
C --> D[文档切片]
D --> E[Embedding向量化]
E --> F[向量数据库]

User[用户Query] --> Q1[Query Embedding]
Q1 --> F

F --> R1[TopK召回]
R1 --> R2[Rerank重排]

R2 --> P[Prompt构建]
P --> LLM[大语言模型]

LLM --> Answer[最终回答]

系统可以拆分为 两个主要链路

离线处理链路

文档 → 解析 → 切片 → embedding → 向量库

在线查询链路

Query → embedding → 检索 → rerank → prompt → LLM

三、文档解析(Document Parsing)

RAG 的第一步是 将各种格式文档转换为结构化文本

企业知识通常来源:

目标是将这些文档转换为统一的文本格式,推荐使用 Markdown,原因包括:


常见解析工具

1 传统解析工具

常用工具:

适合:

优点:

缺点:


2 OCR 文档解析

如果是 扫描版 PDF

需要 OCR:

常用工具:


3 基于大模型的解析

近年越来越多系统使用 LLM + Layout 识别进行解析:

优势:

常见工具:


文档解析流程

flowchart LR

A[PDF/Word/PPT] --> B[Layout识别]
B --> C[OCR]
C --> D[结构解析]
D --> E[Markdown]

四、文本清洗(Text Cleaning)

文档解析后通常需要 文本清洗

常见问题:

示例:

清洗前

Page 3 of 20
Company Confidential

清洗后

删除

五、文档切片(Chunking)

文档切片是 RAG 系统中 最关键的设计之一,它直接影响:

如果切片过大:

如果切片过小:


切片原则

好的 chunk 应满足:

  1. 语义完整
  2. 长度适中
  3. 不破坏上下文

常见切片策略

1. 不切片

适用于:

2. Markdown结构切片(推荐)

利用标题结构切片:

# 一级标题
## 二级标题
### 三级标题

优点:


3. 段落切片

按空行或段落分割。

适用于:


4. 句子切片

按标点切片:

适合:


5. 按固定 Token / 字符数切片

例如:

chunk_size = 512 tokens  
overlap = 50 tokens

优点:

缺点:


Overlap (重叠窗口)设计

Overlap 用于防止语义断裂。

示例:

chunk_size = 500
overlap = 50

切片:

chunk1: 0-500
chunk2: 450-950

推荐经验值:

chunk size overlap
256 20-40
512 50-80
1024 100-150

六、Embedding 向量化

文档切片后,需要将文本转换为 向量表示(Embedding),以支持语义检索。

流程:

flowchart LR

TextChunk --> EmbeddingModel
EmbeddingModel --> Vector

Embedding 模型选型

Embedding 模型的选择需要考虑:


常见 Embedding 模型

开源模型:

商用 API:

模型选择建议

场景 推荐模型
中文业务 BGE-large / BGE-base
多语言 E5-multilingual
轻量部署 BGE-small
高精度 BGE-large

向量维度

常见:

模型 维度
BGE-base 768
BGE-large 1024
OpenAI 1536

Embedding 粒度

Embedding 应该对 切片后的 chunk 进行,而不是整个文档。

Document  
├── Chunk1 → embedding1  
├── Chunk2 → embedding2  
└── Chunk3 → embedding3

这样可以提高检索精度。


七、向量数据库(Vector DB)

向量需要存储在 向量数据库 中以支持高效相似度检索。


向量检索算法

主流 ANN 算法:


向量数据库架构

flowchart TD

Embedding --> Index构建
Index构建 --> HNSW索引
HNSW索引 --> Search
Search --> TopK

常见向量数据库

向量需要存储在 向量数据库 中以支持高效相似度检索。

常见方案分为两类。

传统数据库 + 向量插件

适合 中小规模系统

常见方案:

优点:

缺点:

专用向量数据库

适合 大规模 RAG 系统

常见方案:

优势:

当向量规模达到,千万级,甚至亿级,专用向量数据库的优势非常明显。

FAISS 自建向量引擎

如果需要 极致性能离线系统

可以直接使用 FAISS 构建向量检索系统。

优点:

缺点:


数据规模选型

数据规模 推荐
< 1M pgvector / Elasticsearch
1M - 10M Qdrant / Weaviate
10M - 100M Milvus
> 100M Milvus / 自建 FAISS

八、检索(Retrieval)

检索阶段的目标是:

从知识库中找到与 Query 最相关的文本片段。

流程:

Query → embedding → vector search → TopK Chunk

TopK 参数

推荐:

TopK = 10 ~ 30

九、多路召回(Hybrid Retrieval)

单一向量检索存在问题:

因此通常使用 Hybrid Search

常见组合:

BM25 特别适合:

例如:

"HTTP 502 error"

BM25 的效果通常优于向量检索。


多路召回架构

flowchart TD

Query --> VectorSearch
Query --> BM25
Query --> KeywordSearch

VectorSearch --> Merge
BM25 --> Merge
KeywordSearch --> Merge

Merge --> CandidateSet


十、结果合并(Merge)

多路召回后需要进行 结果合并与去重

步骤:

  1. 去重(duplicate removal)
  2. 按 score 排序
  3. 限制候选数量
  4. 补充上下文

例如:

chunk_i

保证语义完整性。


上下文补充

例如:

chunk_i
chunk_i+1

保证语义完整。


十一、Rerank 重排

向量检索是 粗排(Retrieval)。它的优点是,非常快,可处理亿级数据;缺点是语义理解浅,容易误召回

Rerank 的作用是对候选文档进行 深度语义匹配

(Query, Document) → Score

这种模型通常采用 Cross Encoder 架构

特点:

但计算成本高,因此只用于:

Top 50 → rerank → Top 5


Rerank 原理

输入:

Query + Document

输出:

相关性 Score

Cross Encoder

架构:

[Query + Document] → Transformer → Score

特点:


常见 Reranker


Rerank Pipeline

flowchart TD

VectorSearch --> Top50
Top50 --> Rerank
Rerank --> Top5

十二、Prompt 构建

最后一步是将 检索结果 + 用户问题 组合成 Prompt。

典型结构:

System Prompt
+ Context
+ Conversation History
+ User Query

Prompt 示例

You are a helpful assistant.

Use the following context to answer the question.

Context:
{retrieved_chunks}

Question:
{user_query}

设计要点:

1 限制回答必须基于知识库
2 避免模型编造内容
3 控制 Token 长度

例如为了防止幻觉,prompt可以加入:

If the answer is not in the context, say "I don't know".

十三、Token 控制

LLM 有 上下文长度限制

需要控制:

TopK
chunk_size
history length

推荐:

context tokens < 3000

十四、系统性能优化

RAG 系统瓶颈通常在:

1 embedding
2 vector search
3 rerank
4 LLM


优化方法

1 Query Embedding Cache

相同 query 直接复用。


2 ANN 索引优化

推荐 HNSW 参数:

M=16
efConstruction=200
efSearch=64

3 批量 embedding

batch_size = 32

提高 GPU 利用率。


4 结果缓存

缓存:

query → answer

可减少 LLM 调用。


十五、生产级架构

生产环境通常采用 微服务架构

flowchart TD

User --> API

API --> RetrievalService
API --> LLMService

RetrievalService --> VectorDB
RetrievalService --> RerankService

OfflinePipeline --> DocumentParser
OfflinePipeline --> ChunkService
OfflinePipeline --> EmbeddingService
OfflinePipeline --> VectorDB

十六、进阶 RAG 方向

传统 RAG 只是基础架构,当前行业已经发展出多种增强方案:

Graph RAG

使用 知识图谱增强检索能力:

Entity → Relation → Entity

适用于:


Multi-modal RAG

支持多模态数据:


Agentic RAG

结合 Agent 能力:


总结

一个成熟的 RAG 系统需要重点优化以下四个环节:

  1. 高质量文档解析
  2. 合理的切片策略
  3. 高召回率的检索系统
  4. 高精度的 Rerank 排序

RAG 的核心逻辑可以用一句话概括:

用检索解决知识问题,用大模型解决表达问题。

一个完整的 RAG 系统工程链路:

Documents
 ↓
Parsing
 ↓
Chunking
 ↓
Embedding
 ↓
Vector DB
 ↓
Hybrid Retrieval
 ↓
Rerank
 ↓
Prompt
 ↓
LLM
 ↓
Answer